package Hoja6;

import java.util.Iterator;
import java.util.Scanner;

/*
 * Basado en el libro de Duane A. Bailey, "Java Structures", pág. 305 y 317
 */

/**
 *
 * @author María Fernanda Martínez
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        List freq = new SinglyLinkedList();
        System.out.println("Please enter a message and then press Enter. The message should have at least two different characters"
                +"\notherwise it won't work correctly. \nMessage to encode: ");
        //Mensaje a codificar
        String mensaje = scan.nextLine();
        
        int i=0;
        // Leer datos de entrada
        while (i<mensaje.length())
        {
            // Obtener caracter en posición i
            char c = mensaje.charAt(i); 
            // Verificar que no sea cambio de linea
            if (c == '\n') continue;
            // Buscar caracter en la lista de frecuencia
            Leaf query = new Leaf(c);
            Leaf item = (Leaf)freq.remove(query);
            if (item == null)
            {   // no encontrado, agregar Leaf
                freq.addFirst(query);
                
            } else { // encontrado, incrementar Leaf
                item.frequency++;
                freq.addFirst(item);
                
            }
            i++;
        }
             
        // Insertar cada caracter en un árbol de Huffman
        Iterator li = freq.iterator();
        VectorHeap trees = new VectorHeap();
        while (li.hasNext())
        {
            trees.add(new HuffmanTree((Leaf)li.next()));
        }
        
        // Unir árboles en pares hasta que solo quede uno
        while (trees.size() > 1)
        {
            // Obtener los dos valores más pequeños
            HuffmanTree smallest = (HuffmanTree)trees.remove();
            
            HuffmanTree small = (HuffmanTree)trees.remove();
           
            // Agregar árbol más grande que contiene a ambos
            trees.add(new HuffmanTree(smallest,small));
        }
        if(trees.size()!=0){
            HuffmanTree encoding = (HuffmanTree)trees.remove();
            // Mostrar codificación
            encoding.print();
            System.out.println("\nEnter a sequence of 0 and 1 in order to decode a message.\nMessage to decode: ");
            // Mensaje en 0 y 1 a decodificar
            mensaje=scan.nextLine();
            i=0;
            while(i<mensaje.length()){
                // Mostrar mensaje decodificado
                encoding.decode(mensaje);
                i++;
            }            
            System.out.println();
        }    
    }
}
